En Colombia la producción agricola se enfrenta a retos complejos como el cambio climático, la interrupción de suministros y la competencia externa. Factores como la inflación, el aumento de precios de insumos, transporte, almacenamiento, fenómenos climáticos y malos negocios con intermediarios terminan afectando al productor [2] (Portafolio). Por ejemplo, el diario Portafolio reporta que hace 18 meses producir una hectárea de papa costaba alrededor de $22 millones y los valores de hoy están cercanos a los $40 millones por hectárea. Además de esto los pequeños y medianos productores tienen que competir con importaciones de paises tecnificados donde la producción es mas económica y eficiente. La papa es un caso importante, es un producto esencial para muchos hogares y hoy existe un exceso de oferta en comparación con la demanda[1] (Razon publica).
Desde esta problemática consideramos que es fundamental conocer las tendencias del mercado y los factores que afectan a los cultivos. En el siguiente proyecto realizamos algunos análisis para ayudar a los productores a tomar desiciones informadas y que estas les permitan ser competitivos en el mercado.
Utilizaremos datos históricos de los precios de diferentes productos agricolas en diferentes centros mayoristas del pais, nos centramos en los datos producidos por el departamento nacional de estadística, DANE. Elegimos la región andina de Colombia para acotar el problema, y también nos enfocamos en los productos cosechados en esta región. Analizaremos la variabilidad del precio a lo largo del tiempo con el objetivo de identificar los productos más estables, buscando identificar los productos que podrían tener una rentabilidad más segura. Usaremos datos de algunos factores relacionado en la cadena de producción o suministro, como la inflación, los precios de diferentes insumos y los patrones de precios que siguen estos productos anualmente.
Para analizar los datos utilizaremos principalmente las medidas de tendencia central estadística como la media y la desviación estándar para medir la variabilidad de los productos a lo largo del tiempo. A su vez usaremos la correlación para buscar posibles relaciones entre insumos y los productos.
El objetivo de nuestro proyecto es contribuir a la toma de decisiones informadas en la producción agrícola de pequeña o mediana escala, desde el análisis de datos reales de variables relacionadas al precio de los productos.
A continuación un resumen de las librerías usadas y su propósito.
| Librería | Propósito |
|---|---|
| RColorBrewer | Generación de paletas de colores |
| readxl | Lectura de archivos Excel |
| ggplot2 | Creación de gráficos estadísticos |
| tidyverse | Conjunto de herramientas para el análisis de datos |
| cowplot | Combinación de gráficos |
| lubridate | Manejo de fechas y horas |
| patchwork | Combinación de gráficos |
| tidyr | Transformación de datos |
| dplyr | Selección, manipulación y agregación de datos |
| lubridate | Manejo de fechas y horas |
| skimr | Exploración de datos |
| kableExtra | Mejorar la apariencia de las tablas generadas por la función kable() de la librería knitr |
| knitr | Generar documentos reproducibles en R que contengan código R, texto, tablas y gráficos |
| DT | Crear tablas interactivas en R que pueden ser utilizadas para explorar datos de manera interactiva |
Definimos algunos parámetros diccionarios y variables para los análisis.
En nuestros análisis utilizamos conjuntos de datos de dos fuentes
Datos recolectados por el DANE como parte de la operación SIPSA (Sistema de información de Precios y Abastecimiento) desde el 2012 hasta la fecha. Los conjuntos de datos disponbles son: Precios Mayoristas, Abastecimientos de Alimentos e Insumos y Factores Asociados a la Producción Agropecuaria. Estos datos se recolectan mediante entrevista personal con formulario de papel, en el siguiente enlace se encuentra la ficha técnica https://microdatos.dane.gov.co/index.php/catalog/776
Las series históricas de precios mayoristas tienen 5 variables, la fecha en la cual se tomó la medición del precio del producto, el grupo al que pertenece el producto, el producto como tal, el mercado en donde se tomó la medición y el precio promedio por kilogramo.
A continuación información sobre los datos.
## [1] 1146
| Fecha | Grupo | Producto | Ciudad | Mercado | Precio | |
|---|---|---|---|---|---|---|
| Min. :2013-01-01 00:00:00 | Length:603782 | Length:603782 | Length:603782 | Length:603782 | Min. : 82 | |
| 1st Qu.:2015-09-01 00:00:00 | Class :character | Class :character | Class :character | Class :character | 1st Qu.: 1429 | |
| Median :2018-05-01 00:00:00 | Mode :character | Mode :character | Mode :character | Mode :character | Median : 2990 | |
| Mean :2018-05-04 08:25:59 | NA | NA | NA | NA | Mean : 6369 | |
| 3rd Qu.:2021-01-01 00:00:00 | NA | NA | NA | NA | 3rd Qu.: 8500 | |
| Max. :2023-10-01 00:00:00 | NA | NA | NA | NA | Max. :184278 |
| x | |
|---|---|
| Fecha | 130 |
| Grupo | 9 |
| Producto | 383 |
| Ciudad | 70 |
| Mercado | 110 |
| Precio | 31304 |
## [1] "Total filas 603782"
La seres históricas de insumos tienen dos distintos sets de variables, ya que la tercer hoja del documento alberga el listado de los insumos, con 3 variables, el grupo del insumo, el subgrupo y el nombre del insumo/factor. Luego las demás hojas representan cada una un subgrupo ya establecido en la hoja del listado, estas cuentan con 8 variables, el año en que se tomó la medida, el mes, el codigo del departamento, el nombre del departamento, el codigo del municipio, el nombre del municipio, el nombre del producto, la presentación del producto y el precio promedio.
Leemos los archivos y damos un primer vistazo a los datos.
insumos2023 <- readxl::read_xlsx(paste(folder, "/series-historicas-insumos-2021-2023.xlsx", sep = ""), sheet = 5, range = "A9:I61985")
insumos2020 <- readxl::read_xlsx(paste(folder, "/series-historicas-insumos-2013-2020.xlsx", sep = ""), sheet = 5, range = "A10:I99845")
insumos <- rbind.data.frame(insumos2020, insumos2023)
head(insumos)
tail(insumos)
print("Variables disponibles")
## [1] "Variables disponibles"
names(insumos)
## [1] "Año" "Mes"
## [3] "Código departamento" "Nombre departamento"
## [5] "Código municipio" "Nombre municipio"
## [7] "Nombre del producto" "Presentación del producto"
## [9] "Precio promedio"
Convertimos la fecha a una nueva columna en formato YYYY-MM-DD.
Número de NaN:
## [1] 0
Algunos parámetros estadísticos.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2867 16667 37000 57468 80175 460000
| Name | insumos |
| Number of rows | 161811 |
| Number of columns | 10 |
| _______________________ | |
| Column type frequency: | |
| character | 7 |
| Date | 1 |
| numeric | 2 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Año | 0 | 1 | 4 | 4 | 0 | 11 | 0 |
| Código departamento | 0 | 1 | 2 | 2 | 0 | 25 | 0 |
| Nombre departamento | 0 | 1 | 4 | 18 | 0 | 25 | 0 |
| Código municipio | 0 | 1 | 5 | 5 | 0 | 192 | 0 |
| Nombre municipio | 0 | 1 | 4 | 27 | 0 | 190 | 0 |
| Nombre del producto | 0 | 1 | 3 | 50 | 0 | 268 | 0 |
| Presentación del producto | 0 | 1 | 7 | 23 | 0 | 17 | 0 |
Variable type: Date
| skim_variable | n_missing | complete_rate | min | max | median | n_unique |
|---|---|---|---|---|---|---|
| Fecha | 0 | 1 | 2013-01-01 | 2023-10-01 | 2019-11-01 | 130 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| Mes | 0 | 1 | 6.43 | 3.39 | 1.00 | 4.00 | 6 | 9 | 12 | ▇▆▆▆▇ |
| Precio promedio | 0 | 1 | 57467.55 | 55905.63 | 2866.67 | 16666.67 | 37000 | 80175 | 460000 | ▇▁▁▁▁ |
Productos presentes en el dataset:
| Insumos reportados |
|---|
| 10-20-20, 10-30-10, 13-26-6, 14-4-23-4, 15-15-15, 17-6-18-2(Mg), 18-18-18-1(Mg), 25-4-24, 28-4-0-6(S), Agrimins 8-5-0-6, Biocel Foliar, Boroliq Sl, Borozinco Foliar, Cal Agrícola, Cal Dolomita, Cerostress, Cloruro de Potasio 0-0-60, Cosmocel: 20-30-10 + Edta y Em, Crecer 500, Desarrollo: 30-7-6, Florescencia: 10-28-19, Formador 2000, Fosfato Diamónico (DAP) 18-46-0, Fosfostress, Frutoka: 3-0-40, Germi-K, Humita 15, Hydran Nova 19-4-19-3, Kelatex Calcio, Kelatex Magnesio, Kelatex Zinc, Klip - K Calcio-Boro, Klip Boro, Llenado de Grano 8-0-10 + Boro y Cobre, Nitromag 21-0-0-7, Nutrifoliar Completo, Nutrimins, 18-18-18, Omex Bio 8, Omex K-41, Potreros: 31-8-8-2, Rafos 12-24-12-2, Sulfato de Amonio (Sam) 21-0-0-24(S), Terra Sorb - Foliar, Todo en uno, Tottal, Urea 46%, Wuxal Calcio, Wuxal Tapa Negra, Wuxal Tapa Roja, Agrodesarrollo 25-3-5, Agrofast, Aminoset, Borozinco 240 Gr, Foscrop Pk: 0-30-20, Globafol, Raizal 400: 9-45-11, Sulcamag, Terra Sorb 4 - Radicular, Nutri 15, 10-20-30, 13-26-6-3(CaO) + menores con lombricompost, 25-15-0, A-Micsur, Aminoplant, B-Timin Ag: 25-4-25, Cal Dolomita 65-33, Cal Dolomita 70-25, Compuesto Abimgra, Foliagro 8-23-8 + Secundarios y Em, Hojas, Fertilizante Orgánico de Lombriz San Rafael, Kafe Caldas 25-3-19-3, M@Sai, Microcoljap NPK, Poliquel Multi, Triple Q, Triplehoja, 15-4-23-4(Mg), Amino K-3, Isabion, Marax, Dolfos, Cal Dolomita 57-35, Fosfato Diamónico (DAP) 21-53-0, Poliquel Calcio, Abono Orgánico, 10-30-10 + Secundarios, Fertigro 8-24-0, Todo en Uno, 17-6-18-6(Mg), 25-15-0-2(Mg), Biozyme Tf, Powerplex, Nitron Doble N Granulado: 26-0-0, 10-20-30-1, Agro-K: 0-39-52, Foss 61 Cristales, Kadostim, Microessentials Sz: 12-40-0-10(S), Zinboquim, Cal dolomita 70-25, Cal dolomita, Cosmo-R: 14-8-19 + Edta Y Em, Fertilimor, K-Fol: 0-20-50 Cristales, Cal dolomita 57-35, Unoagro 41-3-3, Nitrabor (Nitrato De Ca+B): 15-0-0-26, Hidran: 19-4-19-3, Sulfato de Potasio 0-0-50-18(S), Calfos Granulado, Nitromag, Nutrifos Agrofert-K, Cal dolomita 65-33, Solu@Gro: 40-3-3, Amida S (Urea-Sulfato De Amonio), Agrimins Completo, Agrimins Inicio, Nutrisuelo, 13-26-10-3(Mg), 27-11-11-2(Mg), Abonissa Kikes Cauca, Afek I, Afek Ii, Aminofer, Aminoquim, Ana-Bor, Arroz Fase 3: 24-0-17-5-6, Boro 21, Boro-K, Calfomag, Cosmo-Foliar Crecimiento: 18-28-8 + Edta Y Em, Cosmo-Foliar Llenado: 0-32-43 + Edta Y Em, Desarrollo: 28-7-12, Dol, Engru-S, Fertigro Calcio, Fertinvesa CaB, Fertinvesa Fosfito de Potasio, Fertinvesa K, Fertinvesa P, Fertirriego Solunk-P Clean: 13-3-43 Cristales, Flores y Frutos: 5-10-43 + Em, Fosfato de Potasio 0-40-53, Humiforte N-6, Integrador, Microfoliar Npk, Micronfos: 8-5-0 + Secundarios Y Em, Microrriego Inicio: 15-25-10, Nadir Fos, Nitro Xtend +S 40-0-0-6, Novaplant Ca-B, Novaplant Ca-B-Zn, Nutri-Aminox, Orbiagro, Pastos 5, Poliquel Zinc, Potak 41, Primer Estado: 15-17-15-2(Mgo), Producir Exa 600, Raise-1, R-Llenito, Solucat 10-52-10, Tercer Estado: 24-0-12-3 (Mgo), Treinta y 1 Grado 31-8-8-2+33% (S), Triple Quin- C, Vicor 3, Zincprod, 15-15-15-3 + Em, Fertinvesa N, Inicio: 13-36-12 + Em, Microrriego Producción: 10-3-40, Novaplant Fosforo, 12-24-12, Fosfacel 800: 20-53-0, Microrriego Menores, Soil, Tacol, Jocker Hj & H, Agrofercol efe-agro, Sulfato de Cobre Cristales, Nutri Phite P Foliar, Dkp 500, Cosmoquel Edta-Calcio, Microrriego Ca Mg: 14-0-3-15(Cao)-5(Mgo) Cristales, Azufre 720 Sc, Promotor 40-3-3, Cab, Sembramon 12-20-12-3 (MgO), 15-15-15 + Esm, Grado palmero 13-5-27-5, Rafos 12-24-12-2 (MgO) 1 S, 10-20-20-4, 10-30-10-3, 11-30-11, 12-24-24, 18-18-18 + Esm, 18-18-18-1-2, Abonagro 15-15-15-4, Afek II, Agrimins K Calcio Boro, Amida S (Urea-Sulfato de Amonio), Biozyme TF, CaB, Cosechando, Cosmo-Foliar Crecimiento: 18-28-8 + Edta y Em, Cosmo-Foliar Llenado: 0-32-43 + Edta y Em, Cosmo-R: 14-8-19 + Edta y Em, Desarrollo Sn Cristales, DKP 500, Fertinvesa, Fertiplant, Fertiplant-Mins, Foscrop PK: 0-30-20, Jocker H J & H, Klip - K Calcio, Levante, Mezclas Nórdicas Soluban 13-2-30-2, Microessentials SZ: 12-40-0-10(S), Microfoliar NPK, Micronfos: 8-5-0 + Secundarios y Em, Microrriego Ca Mg: 14-0-3-15(CaO)-5(MgO) Cristales, Nitrabor (Nitrato de Ca+B): 15-0-0-26, Nitrate Balancer, Nitro-K: 13-3-43 Cristales, Platanero: 11-5-27-7-9, Primer Estado: 15-17-15-2(MgO), Prod 17: 17-6-18-2+(S), Rafos 12-24-12-2(MgO) 1S, Roca Fosfórica, Sembramon 12-20-12-3(MgO), Sulfato de Amonio (SAM) 21-0-0-24(S), Tercer Estado: 24-0-12-3(MgO), Treinta y 1: 31-8-8-2+3(S), Zintrac MgB, 12-8-24-3(MgO), Globafol NF, Korn-Kali + B, Mezclas Guayacan: 31-8-8, Nutricarga 19-4-18-3(MgO), 13-26-10, 15-5-30, Nitro Xtend + Mg 39-0-3 + 2(MgO) + 3s, Viva NF, 10-54-10, Microkel Boro, 15-15-15-11(S), Humito P200 Fertil, Poliquel Magnesio + Aa, 15-15-15-10, Actiplant, Amino Gib, Microkel Calcio Boro, Soluplant CaBoK, Soluplant K-Llenado, Soluplant Solufoliar, 12-11-18-3(MgO)-8S+EM, Crecimix: 38-6-3 + Secundarios y Em, NBX+Mo, Todo en Uno NF, K-Tionic, Teprosyn Np+Zn, 20-3-18-3(MgO), CaBtrac, Sikon Fert Cobre Zinc, 12-11-18-3(MgO)-8S+Em, Triple 15 ARAMA |
Municipios de los que se tienen datos.
| Municipio con reporte de datos para insumos |
|---|
| Bogotá, D.C., Bucaramanga, Cajamarca, Cali, Cáqueza, Chipaque, Choachí, Corinto, Cota, El Carmen de Viboral, El Santuario, Entrerríos, Fómeque, Girón, Guarne, La Ceja, Manizales, Marinilla, Medellín, Palmira, Pamplona, Pasto, Peñol, Popayán, Pupiales, Rionegro, San Vicente Ferrer, Subachoque, Tunja, Túquerres, Ventaquemada, Ábrego, Agustín Codazzi, Chiquinquirá, Ocaña, Piendamó, Villa de San Diego de Ubaté, Andes, Calarcá, Guadalajara de Buga, Ibagué, La Plata, Málaga, Montenegro, Neiva, Quimbaya, Riosucio, San Gil, Santander de Quilichao, Tuluá, Vélez, Chocontá, Samacá, Sibaté, Villapinzón, Armenia, Caicedonia, Granada, Pereira, Santa Rosa de Cabal, Socorro, Barbosa, Belén de Umbría, Cúcuta, Duitama, Facatativá, Ipiales, Jamundí, La Dorada, La Pintada, La Unión, Madrid, Marsella, Moniquirá, Piedecuesta, San Alberto, San Pedro de Los Milagros, Santa Bárbara, Silos, Valledupar, Villanueva, Villavicencio, Yopal, Zipaquirá, Buesaco, Pitalito, El Zulia, Espinal, Puerto López, Lebrija, Garzón, Girardot, Chitagá, Aquitania, La Celia, Santa Rosa de Osos, Sogamoso, Cereté, Fresno, Sevilla, Tibaná, Magangué, Sabana de Torres, Apía, La Virginia, Roldanillo, Betania, Corozal, Pacho, Cartago, Chinácota, Aguachica, Fundación, Chinchiná, El Carmen de Bolívar, Anserma, Cartagena de Indias, Montería, San Vicente de Chucurí, Santa Marta, Cachipay, Chía, Neira, Funza, Saldaña, Viterbo, Puerto Tejada, Sincelejo, La Mesa, Villeta, San Marcos, Sabanalarga, Lérida, Fusagasugá, Guaduas, Sonsón, Yarumal, Cimitarra, Dagua, Garagoa, Sibundoy, Caucasia, Ramiriquí, El Rosal, San Sebastián de Mariquita, Campoalegre, Algeciras, San Bernardo, Salamina, Florencia, El Doncello, Cumbal, San Andrés de Tumaco, Guachucal, Puerto Rico, Guateque, Lorica, Sutamarchán, Toca, Belén, Guática, Chaparral, Líbano, Supía, Córdoba, Pasca, Abejorral, María La Baja, Donmatías, Saravena, Arauca, Arcabuco, Isnos, Turmequé, Rovira, Barranquilla, Galeras, Urrao, Trujillo, Quinchía, Santuario, Aguazul, Paz de Ariporo, Venadillo, Piendamó - Tunía, San José de Cúcuta, Icononzo, Anzoátegui, Tauramena, Guamo |
Cambiamos el nombre de las columnas para facilitar el trabajo y filtramos los datos para los departamentos andinos.
departamentos_andinos <- c("Antioquia", "Boyacá", "Cundinamarca", "Norte de Santander", "Santander",
"Tolima", "Huila", "Caldas", "Quindío", "Risaralda", "Nariño")
# cambiando nombres de columnas a algo mas amigable
insumos$Departamento <- insumos$`Nombre departamento`
insumos <- insumos[, !names(insumos) %in% 'Nombre departamento']
insumos$Insumo <- insumos$`Nombre del producto`
insumos <- insumos[, !names(insumos) %in% 'Nombre del producto']
insumos_andino <- insumos %>%
filter(Departamento %in% departamentos_andinos)
print("Número de registros de insumos andinos")
## [1] "Número de registros de insumos andinos"
nrow(insumos_andino)
## [1] 129415
Las series históricas de abastecimiento tienen 38 variables, la fecha en la cual se tomó la medición, el total de abastecimiento, la variación mensual del abastecimiento, la variación anual del abastecimiento, dos variables de empalme, y de la número 7 a la 38 son distintos mercados en donde se tiene el valor de abastecimiento.
Inicialmente pensamos en relacionar el precio de los productos con
los datos de abastecimiento, sin embargo, al revisar los datos de
abastecimeinto notamos que el valor era un dato global. Por esta razón
decidimos abandonar los análisis. La exploración inicial la realizamos
con el script scripts/preciosvsBodegas.R
##🧹 Extaracción y limpieza
En términos técnicos los datos se encuentran en hojas de cálculo
formato Excel, separados por periodos en diferentes archivos y/o hojas
de cálculo. Para usarlos y entenderlos de una manera más eficiente,
creamos un archivo agrupado, el script usado se encuentra en el
directorio scripts. Además de esto, fue necesario hacer
conversiones en las variables de fechas para poder realizar los
análisis, especialmente las gráficas y la busqueda de relaciones.
La exploración inicial la realizamos de manera visual, el tamaño de los archivos nos permitio visualizarlo y entre otras cosas identificar las hojas y rangos en los que se encontraban los datos de interés.
Ya que hemos eliminado los datos nulos y arreglado los datos podemos ver que tienen.
print(names(datos))
## [1] "Fecha" "Grupo" "Producto" "Ciudad" "Mercado" "Precio"
Nos aseguramos de que por cada año hay aproximadamente la misma cantidad de filas. A excepción de 2023 ya que los datos solo están hasta Octubre.
Los 8 grupos de productos que tenemos estan distribuidos como se muestra en la figura. Nos centraremos principalmente en los productos agricolas que represntan alrededor del 60% de los productos en el dataset.
## [1] "Porcentaje productos agricolas 60.29"
En el grupo de productos agricolas tenemos estos
productos:
| Grupo | Productos |
|---|---|
| FRUTAS | Aguacate común, Aguacate Hass, Aguacate papelillo, Badea, Banano bocadillo, Banano criollo, Banano Urabá, Borojó, Breva, Ciruela negra chilena, Ciruela roja, Coco, Curuba, Curuba redonda, Durazno importado, Durazno nacional, Feijoa, Fresa, Granadilla, Guanábana, Guayaba agria, Guayaba Atlántico, Guayaba común, Guayaba manzana, Guayaba pera, Gulupa, Higo, Kiwi, Limón común, Limón común Ciénaga, Limón común valluno, Limón mandarino, Limón Tahití, Lulo, Mandarina Arrayana, Mandarina común, Mandarina Oneco, Mango común, Mango de azúcar, Mango manzano, Mango reina, Mango Tommy, Manzana nacional, Manzana roja importada, Manzana royal gala importada, Manzana verde importada, Maracuyá, Maracuyá antioqueño, Maracuyá huilense, Maracuyá santandereano, Maracuyá valluno, Melón Cantalup, Mora de Castilla, Naranja común, Naranja Valencia, Papaya hawaiana, Papaya Maradol, Papaya melona, Papaya redonda, Patilla, Pera importada, Pera nacional, Piña gold, Piña manzana, Piña perolera, Pitahaya, Tangelo, Tomate de árbol, Uchuva con cáscara, Uva importada, Uva Isabela, Uva negra, Uva red globe nacional, Uva roja, Uva verde, Zapote, Limón común ecuatoriano, Mango mariquiteño, Piña Cayena, Mango costeño, Mango Kent, Naranja Sweet, Patilla baby, Ciruela negra importada, Papaya tainung, Ciruela importada, Mango Yulima, Guayaba pera valluna, Papaya Paulina, Mandarina arrayana |
| GRANOS Y CEREALES | Arroz de primera, Arroz de segunda, Arroz excelso, Arroz sopa cristal, Arveja amarilla seca importada, Arveja enlatada, Arveja verde seca importada, Cuchuco de cebada, Cuchuco de maíz, Fríjol bolón, Fríjol cabeza negra importado, Fríjol cabeza negra nacional, Fríjol calima, Fríjol cargamanto blanco, Fríjol cargamanto rojo, Fríjol enlatado, Fríjol nima calima, Fríjol palomito importado, Fríjol radical, Fríjol Uribe rosado, Fríjol Zaragoza, Garbanzo importado, Lenteja importada, Maíz amarillo cáscara, Maíz amarillo trillado, Maíz blanco cáscara, Maíz blanco retrillado, Maíz blanco trillado, Maíz enlatado, Maíz pira, Lenteja nacional, Arroz blanco importado, Maíz amarillo retrillado, Maíz amarillo cáscara importado |
| TUBERCULOS, RAICES Y PLATANOS | Arracacha amarilla, Arracacha blanca, Ñame criollo, Ñame diamante, Ñame espino, Papa capira, Papa criolla limpia, Papa criolla para lavar, Papa criolla sucia, Papa ICA-Huila, Papa Morasurco, Papa nevada, Papa parda pastusa, Papa Puracé, Papa roja peruana, Papa rubí, Papa R-12 negra, Papa R-12 roja, Papa sabanera, Papa San Félix, Papa suprema, Papa tocana, Papa tocarreña, Papa única, Plátano comino, Plátano dominico hartón maduro, Plátano dominico hartón verde, Plátano dominico verde, Plátano guineo, Plátano hartón maduro, Plátano hartón verde, Plátano hartón verde ecuatoriano, Plátano hartón verde llanero, Plátano hartón verde venezolano, Ulluco, Yuca chirosa, Yuca criolla, Yuca ICA, Yuca llanera, Papa Betina, Papa superior, Plátano hartón verde Eje Cafetero |
| VERDURAS Y HORTALIZAS | Acelga, Ahuyama, Ají topito dulce, Ajo, Ajo importado, Apio, Arveja verde en vaina, Arveja verde en vaina pastusa, Berenjena, Brócoli, Calabacín, Calabaza, Cebolla cabezona blanca, Cebolla cabezona blanca bogotana, Cebolla cabezona blanca ecuatoriana, Cebolla cabezona blanca importada, Cebolla cabezona blanca pastusa, Cebolla cabezona blanca peruana, Cebolla cabezona roja, Cebolla cabezona roja ecuatoriana, Cebolla cabezona roja importada, Cebolla cabezona roja ocañera, Cebolla cabezona roja peruana, Cebolla junca, Cebolla junca Aquitania, Cebolla junca Berlín, Cebolla junca pastusa, Cebolla junca Tenerife, Cebolla puerro, Cebollín chino, Chócolo mazorca, Cidra, Cilantro, Coles, Coliflor, Espinaca, Fríjol verde bolo, Fríjol verde cargamanto, Fríjol verde en vaina, Haba verde, Habichuela, Habichuela larga, Lechuga Batavia, Lechuga crespa morada, Lechuga crespa verde, Pepino cohombro, Pepino de rellenar, Perejil, Pimentón, Pimentón verde, Rábano rojo, Remolacha, Remolacha bogotana, Remolacha regional, Repollo blanco, Repollo blanco bogotano, Repollo morado, Repollo verde, Tomate chonto, Tomate chonto regional, Tomate larga vida, Tomate riñón, Tomate riñón valluno, Tomate Riogrande, Tomate Riogrande bumangués, Tomate Riogrande ocañero, Zanahoria, Zanahoria bogotana, Zanahoria larga vida, Ahuyamín (Sakata), Repollo blanco valluno, Tomate chonto valluno |
Además revisamos que tenemos muchas ciudades y mercados:
print(paste("Ciudades : ", length(unique(datos$Ciudad))))
## [1] "Ciudades : 70"
Ya que tenemos una gran cantidades de datos, decidimos centrarnos en los principales productos de la región andina de Colombia. Investigando en internet decidimos quedarnos con los productos agricolas afines a esta región. Entonces basaremos nuestro análisis en estos productos:
| Grupo | Productos |
|---|---|
| FRUTAS | Aguacate común, Aguacate Hass, Aguacate papelillo, Curuba, Curuba redonda, Feijoa, Fresa, Granadilla, Guanábana, Guayaba agria, Guayaba común, Guayaba manzana, Guayaba pera, Higo, Lulo, Mango común, Maracuyá, Mora de Castilla, Papaya Maradol, Pera nacional, Piña gold, Tomate de árbol |
| GRANOS Y CEREALES | Fríjol nima calima, Fríjol radical, Fríjol Uribe rosado, Maíz amarillo cáscara, Maíz amarillo trillado, Maíz blanco trillado |
| TUBERCULOS, RAICES Y PLATANOS | Arracacha amarilla, Arracacha blanca, Papa capira, Papa criolla limpia, Papa criolla sucia, Papa ICA-Huila, Papa nevada, Papa parda pastusa, Papa Puracé, Papa rubí, Papa R-12 negra, Papa R-12 roja, Papa sabanera, Papa San Félix, Papa suprema, Papa tocana, Papa tocarreña, Papa única, Plátano comino, Plátano dominico hartón maduro, Plátano dominico hartón verde, Plátano dominico verde, Plátano guineo, Plátano hartón maduro, Plátano hartón verde, Plátano hartón verde llanero, Plátano hartón verde venezolano, Ulluco, Yuca chirosa, Yuca criolla, Yuca ICA, Yuca llanera |
## [1] "Cantidad de productos: 62"
## [1] "Cantidad de mercados 39"
Graficamos el comportamiento desde 2013 a 2023 de algunos productos buscando patrones anuales probablemente causados por el clima y la temporada en que se producen los productos:
p1 = producto_comportamiento_tiempo("Aguacate papelillo")
p2 = producto_comportamiento_ciudades("Aguacate papelillo", 2023)
## `summarise()` has grouped output by 'mes'. You can override using the `.groups`
## argument.
print(p1)
print(p2)
Variables disponibles
names(insumos)
## [1] "Año" "Mes"
## [3] "Código departamento" "Código municipio"
## [5] "Nombre municipio" "Presentación del producto"
## [7] "Precio promedio" "Fecha"
## [9] "Departamento" "Insumo"
Seleccionamos nitrogeno por ser este uno de los insumos más usado en los planes de fertilización y generamos algunos gráficos.
Produto = Nitromag 21-0-0-7
nitrogeno <- filter(insumos, Insumo == "Nitromag 21-0-0-7" & `Nombre municipio` == "Socorro")
hist(nitrogeno$`Precio promedio`, main = "Histograma Precio promedio")
# Historico
plot(nitrogeno$Fecha, nitrogeno$`Precio promedio`, type = "l", main = "Historico de Nitrogeno para Socorro, Santander", xlab = "Fecha", ylab = "Precio")
# Historico suavizado
ggplot(nitrogeno, aes(x = Fecha, y = `Precio promedio`)) +
geom_smooth(method = "loess", formula = y ~ x) +
labs(title = "Historico de Nitrogeno para Socorro, Santander (Suavizado)", x = "Fecha", y = "Precio")
Ahora buscaremos los productos con menor y mayor variablidad en precio a lo largo del tiempo. Para esto escribimos una función para normalizar los precios de un producto respecto al máximo precio de cada año.
# normalizar precios a nivel recional
normalizar_producto_tiempo <- function(nombre_producto){
# Promedio mensual del precio a nivel regional
promedios_regional <- datos_agro %>%
filter(Producto == nombre_producto) %>%
group_by(Fecha) %>%
summarize(Promedio = mean(Precio))
# Normalizar los precios para tener valores entre 0 y 1, mas faciles de comparar
promedios_regional_normalizado <- promedios_regional %>%
group_by(year = lubridate::year(Fecha)) %>%
mutate(Promedio_normalizado = (Promedio / (max(Promedio, na.rm = TRUE))))
return(promedios_regional_normalizado)
}
El código que se muestra anteriormente hace lo siguiente:
Por cada producto en el dataset se agrupa por fecha y se obtiene el promedio del precio por año-mes en toda la región andina.
Se normalizan los valores por año de cada producto. Los precios en 2013 serán más bajos que los de 2023 debido a la inflación. Como queremos ver la variabilidad del producto normalizaremos \(precio\_normalizado = \frac{precio}{max(precio \ año)}\)
Con los valores normalizados que retorna esa función podemos calcular la desviación estándar de los productos en el tiempo. Para verlo con un ejemplo con un par de productos:
i = "Papa criolla limpia"
promedios_regional_normalizado = normalizar_producto_tiempo(i)
sd = sd(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE)
h <- ggplot() +
geom_line(data = promedios_regional_normalizado, aes(x = Fecha, y = Promedio_normalizado), linewidth = 1) +
labs(title = paste("Precio 2013-2023: ", i, "\n Desviación estándar: ", sd ),
y="Precio")
print(h)
# para un producto que casi no cambia
i = "Fresa"
promedios_regional_normalizado = normalizar_producto_tiempo(i)
sd = sd(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE)
h <- ggplot() +
geom_line(data = promedios_regional_normalizado, aes(x = Fecha, y = Promedio_normalizado), linewidth = 1) +
labs(title = paste("Precio 2013-2023: ", i, "\n Desviación estándar: ", sd ),
y="Precio")
print(h)
Ahora para todos los productos obtuvimos la desviación estándar, sin embargo notamos que habian varios productos que aparecen en muy pocas ciudades lo que nos da un resultado de baja confiabilidad.
# Calcular desviacion estandar de los precios normalizados
df <- data.frame()
# Normalizar daticos agro por producto
for (i in unique(datos_agro$Producto)) {
# Ver por año cuantas ciudades tienen ese producto en promedio
numciudades <- promedioCiudades(i)
# Obtener promedios regionales normalizados
promedios_regional_normalizado = normalizar_producto_tiempo(i)
# Calcular desviacion estandar de los precios normalizados
r <- data.frame(
Producto = i,
Promedio_normalizado = mean(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE),
Sd = sd(promedios_regional_normalizado$Promedio_normalizado, na.rm = TRUE),
Num_ciudades = numciudades
)
# Agregar fila al dataframe de resultado
df <- bind_rows(df, r)
}
Filtrando los productos que aparezcan en promedio al menos en 10 ciudades, buscamos los cinco productos con menor y mayor desviacion estándar.
df <- filter(df, Num_ciudades > 10 )
# Obtenemos n los datos que menos y mas varian
n = 5
menor_sd <- (arrange(df,Sd))
mayor_sd <- (arrange(df,desc(Sd)))
ggplot(df, aes(x = Producto, y = Sd )) +
geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
labs(
title = "Desviación estandar del precio a lo largo del tiempo",
x = "Producto",
y = "Desviación estandar"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
kable(head(menor_sd, 5), format = "markdown", caption = "Productos con menor desviación estándar")
| Producto | Promedio_normalizado | Sd | Num_ciudades |
|---|---|---|---|
| Fresa | 0.9394952 | 0.0430403 | 13.36364 |
| Maíz blanco trillado | 0.9203426 | 0.0828000 | 10.54545 |
| Guanábana | 0.8669064 | 0.0980856 | 14.63636 |
| Guayaba pera | 0.8481332 | 0.1014958 | 17.00000 |
| Curuba | 0.8356012 | 0.1042286 | 13.90909 |
selectos_min <- filter(datos_agro, Producto %in% menor_sd[0:n,]$Producto)
kable(head(mayor_sd,5), format = "markdown", caption = "Productos con mayor desviación estándar")
| Producto | Promedio_normalizado | Sd | Num_ciudades |
|---|---|---|---|
| Papa parda pastusa | 0.6984575 | 0.2011734 | 10.90909 |
| Papa capira | 0.7266966 | 0.1949483 | 15.63636 |
| Papa criolla limpia | 0.7398807 | 0.1908542 | 21.00000 |
| Arracacha amarilla | 0.7988382 | 0.1786509 | 11.09091 |
| Aguacate papelillo | 0.7817468 | 0.1555544 | 17.00000 |
selectos_max <- filter(datos_agro, Producto %in% mayor_sd[0:n,]$Producto)
# Grafica la variacion del precio a lo largo del tiempo
plot_min <- graficar_tiempo_producto(selectos_min, "Menor desviacion")
## `summarise()` has grouped output by 'Fecha'. You can override using the
## `.groups` argument.
plot_mas <- graficar_tiempo_producto(selectos_max, "Mayor desviacion")
## `summarise()` has grouped output by 'Fecha'. You can override using the
## `.groups` argument.
# para graficar en una sola figura
print(plot_min)
print(plot_mas)
Ahora graficando los comportamientos anuales de cada producto
# Graficar por cada producto
for(i in unique(selectos_min$Producto)) {
plot1 <- producto_comportamiento_tiempo(i)
print(plot1)
}
# Graficar por cada producto
for(i in unique(selectos_max$Producto)) {
plot1 <- producto_comportamiento_tiempo(i)
print(plot1)
}
Seleccionamos 3 productos para ver su comportamiento respecto al precio del Nitrogeno.
producto <- filter(datos, Ciudad == "Bucaramanga" & Mercado == "Bucaramanga, Centroabastos" & Producto == "Lulo")
producto2 <- filter(datos, Ciudad == "Bucaramanga" & Mercado == "Bucaramanga, Centroabastos" & Producto == "Fresa")
producto3 <- filter(datos, Ciudad == "Bucaramanga" & Mercado == "Bucaramanga, Centroabastos" & Producto == "Papa criolla limpia")
ggplot(producto, aes(x = Fecha, y = Precio)) +
geom_smooth(method = "loess", formula = y ~ x, color = "orange", label = "Lulo") +
geom_smooth(data = producto2, aes(x = Fecha, y = Precio), color = "green", label = "Fresa") +
geom_smooth(data = producto3, aes(x = Fecha, y = Precio), color = "red", label = "Papa criolla") +
labs(title = "Precio historico de los productos (Suavizado)", x = "Fecha", y = "Total")
Normalizamos los valores para graficar los productos y el precio del
insumo.
productoNorm <- producto %>%
mutate(precio_normalizado = scale(Precio))
producto2Norm <- producto2 %>%
mutate(precio_normalizado = scale(Precio))
producto3Norm <- producto3 %>%
mutate(precio_normalizado = scale(Precio))
insumosNorm <- nitrogeno %>%
mutate(total_normalizado = scale(`Precio promedio`))
productoNorm$Fecha <- as.Date(productoNorm$Fecha, format = "%Y-%m-%d")
producto2Norm$Fecha <- as.Date(producto2Norm$Fecha, format = "%Y-%m-%d")
producto3Norm$Fecha <- as.Date(producto3Norm$Fecha, format = "%Y-%m-%d")
ggplot(insumosNorm, aes(x = Fecha, y = total_normalizado)) +
geom_smooth(method = "loess", formula = y ~ x) +
geom_smooth(data = productoNorm, aes(x = Fecha, y = precio_normalizado, label = "Lulo"), color = "orange", label = "Lulo") +
geom_smooth(data = producto2Norm, aes(x = Fecha, y = precio_normalizado, label = "Fresa"), color = "green") +
geom_smooth(data = producto3Norm, aes(x = Fecha, y = precio_normalizado, label = "Papa criolla"), color = "red") +
labs(title = "Nitrogeno y Precio de los Productos (Suavizado)", x = "Fecha", y = "Y")
Buscamos si existe una correlacion entre el precio de los productos y los insumos
merged_data <- merge(selectos_min, insumos_andino, by = c("Departamento", "Fecha"))
correlation_matrix <- merged_data %>%
group_by(Producto, Insumo) %>%
summarise(correlation = cor(Precio, `Precio promedio`, use = "complete.obs"))
## Warning: There were 33 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `correlation = cor(Precio, `Precio promedio`, use =
## "complete.obs")`.
## ℹ In group 8: `Producto = "Curuba"`, `Insumo = "12-11-18-3(MgO)-8S+Em"`.
## Caused by warning in `cor()`:
## ! the standard deviation is zero
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 32 remaining warnings.
## `summarise()` has grouped output by 'Producto'. You can override using the
## `.groups` argument.
# Ordenar de mayor a menor
correlation_matrix <- correlation_matrix %>%
arrange(Producto, desc(abs(correlation)))
m = 3
top_correlations <- correlation_matrix %>%
group_by(Producto) %>%
top_n(m, wt = abs(correlation))
head(top_correlations)